package com.smart.common.utils.FormatData;
 
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
 
import java.util.List;
import java.util.Map;
import java.util.Set;
 
public class JsonXmlUtils {
 
    public  static JSONObject toJson(String xml){
        JSONObject jsonObject = new JSONObject();
        Document document = null;
        try {
            document = DocumentHelper.parseText(xml);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        //获取根节点元素对象
        Element root = document.getRootElement();
        return xmlToJson(root,jsonObject);
    }
 
    public static JSONObject  xmlToJson(Element node,JSONObject json){
        //获取子节点list
        List<Element> list = node.elements();
        //获取节点名字
        String name = node.getName();
        //最下面的一层
        if(list.isEmpty()){
            String nodeValue = node.getTextTrim();
            json.put(name, nodeValue);
        }else{
            //下级节点进行嵌套
            JSONObject js = new JSONObject();
            //判断json数据中是否存在相同的 key
            //存在相同的key需要使用数组存储
            if(json.containsKey(name)){
                JSONArray jsonArray = null;
                Object o = json.get(name);
                if(o instanceof JSONArray){
                    jsonArray=(JSONArray) o;
                }else{
                    jsonArray = new JSONArray();
                    jsonArray.add(o);
                }
                json.put(name,jsonArray);
                jsonArray.add(js);
            }else {
                json.put(name,js);
            }
            //递归
            for (Element element : list) {
                xmlToJson(element,js);
            }
 
        }
        return json;
    }
 
    /**
     * 将json字符串转换成xml
     *
     * @param json
     *            json字符串
     * @throws Exception
     */
    public static Element toXml(String json,Element root) {
        JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
        Element ee = jsonToXml(jsonObject, root, null);
        return ee.elements().get(0);
    }
 
    /**
     * 将json字符串转换成xml
     *
     * @param jsonElement
     *            待解析json对象元素
     * @param parentElement
     *            上一层xml的dom对象
     * @param name
     *            父节点
     */
    public static Element jsonToXml(JsonElement jsonElement, Element parentElement, String name) {
        if (jsonElement instanceof JsonArray) {
            //是json数据，需继续解析
            JsonArray sonJsonArray = (JsonArray)jsonElement;
            for (int i = 0; i < sonJsonArray.size(); i++) {
                JsonElement arrayElement = sonJsonArray.get(i);
                jsonToXml(arrayElement, parentElement, name);
            }
        }else if (jsonElement instanceof JsonObject) {
            //说明是一个json对象字符串，需要继续解析
            JsonObject sonJsonObject = (JsonObject) jsonElement;
            Element currentElement = null;
            if (name != null) {
                currentElement = parentElement.addElement(name);
            }
            Set<Map.Entry<String, JsonElement>> set = sonJsonObject.entrySet();
            for (Map.Entry<String, JsonElement> s : set) {
                jsonToXml(s.getValue(), currentElement != null ? currentElement : parentElement, s.getKey());
            }
        } else {
            //说明是一个键值对的key,可以作为节点插入了
            Element el = parentElement.addElement(name);
            el.addText(jsonElement.getAsString());
        }
        return parentElement;
    }
    public static boolean isJson(String jsonStr) {
        try {
            // 使用Gson库解析JSON字符串
            new JsonParser().parse(jsonStr);
            return true;
        } catch (Exception e) {
            // 如果解析过程中出现异常，则字符串不是有效的JSON
            return false;
        }
    }
}